\section{Traducci\'on a PostScript}

\subsection{Tipo de traducci\'on}

Para la traducci\'on de una cadena de $F$ a una respectiva de $PostScript$, utilizamos traducci\'on dirigida por la sintaxis.

\subsection{Atributos sobre los no-terminales}

Los no-terminales de tipo \textit{graphic} contendr\'an los siguientes atributos:

\begin{itemize}

\item \textbf{code}: cadena del lenguaje $PostScript$ asociada al gr\'afico que la contiene.

\item \textbf{labels}: lista de tuplas (definiendo/instanciando, etiqueta) que representa la lista de etiquetas en orden seg\'un aparecen en la cadena que representa el gr\'afico en cuesti\'on. La i-\'esima tupla de esta lista se asocia a la i-\'esima vez que aparece una etiqueta (una cadena de letras que no es palabra clave). Como cada aparici\'on de una etiqueta puede ser de definici\'on o de instancia, el primer elemento de la i-\'esima tupla representa esta condici\'on asociada a la i-\'esima etiqueta de la cadena.

\end{itemize}

A modo de ejemplo, el gr\'afico representado por la cadena: ``\texttt{define nombre circle 1 nombre}'' podr\'ia contener los atributos:

\begin{itemize}
\item \textbf{code}: ``\texttt{/nombre \{ circ \} def nombre}''

\item \textbf{labels}: [(definiendo, ``nombre''), (instanciando, ``nombre'')]
\end{itemize}

Se asume que todos los $tokens$ tienen un valor ya predefinido que se corresponde consigo mismo. Por ejemplo, el valor del token CIRCLE dentro del c\'odigo es ``circle''; y el de un NOTNATURAL su valor en forma de cadena, como por ejemplo ``-3.5''. Adem\'as, se asume que no s\'olo los $tokens$, sino cualquier no-terminal diferente de $graphics$, poseen un valor de tipo string. Esto significa que no hace falta acceder a un atributo de la forma s\'imbolo.valor, sino que s\'imbolo (como variable) ya posee dicha cadena.
\newline

De esta forma, podemos ir sintetizando los c\'odigos generados por cada gr\'afico por separado, sin preocuparnos acerca de las etiquetas, puesto que una vez se haya reducido de $graphic$ a $statement$ lo \'unico que tendremos que hacer es validar en ese momento que todas las etiquetas est\'en definidas antes de ser instanciadas; y si no lo est\'an, generamos un error.

\subsection{Implementaci\'on}

Para la implementaci\'on utilizamos Python con el lexer $lex$ y el parser $yacc$ que es un parser $LALR$ (Look Ahead Left-to-right Rightmost derivation). Adem\'as de indicarle al parser qu\'e tokens deber\'a reconocer, debemos indicarle qu\'e gram\'atica queremos que identifique, y lo m\'as importante, qu\'e c\'odigo deber\'a ejecutar al aplicar cada producci\'on. Dado que los tokens y la gram\'atica la definimos en la secci\'on anterior, definamos los bloques de c\'odigo a ejecutar:

\newpage

\begin{itemize}
\item statement $\rightarrow$ graphic\\
\texttt{
si graphic.labels mal definida:\\
\hspace*{2em}generar error con posici\'on de la primera etiqueta indefinida\footnote{Ver el c\'odigo para m\'as detalles}\\
statement $\leftarrow$ $''$  \\
statement $\leftarrow$ statement + '5 dict begin '\\
statement $\leftarrow$ statement + '/box \{ '\\
statement $\leftarrow$ statement + '0 0 moveto 0 1 lineto 1 1 lineto 1 0 lineto closepath fill '\\
statement $\leftarrow$ statement + '\} def '\\
statement $\leftarrow$ statement + '/circ \{ '\\
statement $\leftarrow$ statement + '0 0 1 0 360 arc closepath fill '\\
statement $\leftarrow$ statement + '\} def '\\
statement $\leftarrow$ statement + graphic\\
statement $\leftarrow$ statement + ' end '\\
statement $\leftarrow$ statement + 'showpage'}\\
\item graphic $\rightarrow$ CIRCLE num\\
\texttt{
si numero(num) = 1:\\
\hspace*{2em}graphic.code $\leftarrow$ 'circ'\\
si no:\\
\hspace*{2em}graphic.code $\leftarrow$ num + ' ' + num + ' scale circ'\\
graphic.labels $\leftarrow$ $[]$}\\
\item graphic $\rightarrow$ BOX num$_1$ num$_2$\\
\texttt{
si numero(num$_1$) = 1 y numero(num$_2$) = 1:\\
\hspace*{2em}graphic.code $\leftarrow$ 'box'\\
else:\\
\hspace*{2em}graphic.code $\leftarrow$ num$_1$ + ' ' + num$_2$ + ' scale box'\\
graphic.labels $\leftarrow$ $[]$}\\
\item graphic$_1$ $\rightarrow$ MOVE num$_1$ num$_2$ graphic$_2$\\
\texttt{
graphic$_1$.code $\leftarrow$ num$_1$ + ' ' + num$_2$ + ' translate ' + graphic$_2$.code\\
graphic$_1$.labels $\leftarrow$  graphic$_2$.labels}\\
\item graphic$_1$ $\rightarrow$ SCALE num$_1$ num$_2$ graphic$_2$\\
\texttt{
graphic$_1$.code $\leftarrow$ num$_1$ + ' ' + num$_2$ + ' scale ' + graphic$_2$.code\\
graphic$_1$.labels $\leftarrow$  graphic$_2$.labels}\\
\item graphic$_1$ $\rightarrow$ ROTATE num graphic$_2$\\
\texttt{
graphic$_1$.code $\leftarrow$ num + ' scale ' + graphic$_2$.code\\
graphic$_1$.labels $\leftarrow$  graphic$_2$.labels}\\
\newpage
\item graphic$_1$ $\rightarrow$ REPEAT NATURAL num$_1$ num$_2$ graphic$_2$\\
\texttt{
graphic$_1$.code $\leftarrow$ NATURAL + ' \{ gsave ' + graphic$_2$.code + ' grestore '\\
graphic$_1$.code $\leftarrow$ graphic$_1$.code + num$_1$ + ' ' + num$_2$ + ' translate \} repeat'\\
graphic$_1$.labels $\leftarrow$  graphic$_2$.labels}\\
\item graphic$_1$ $\rightarrow$ DEFINE LABEL graphic$_2$\\
\texttt{
graphic$_1$.code $\leftarrow$ '/\_' + lower(LABEL) + ' { ' + graphic$_2$.code + ' } def'
\footnote{Notar que le agregamos un gui\'on bajo adelante de cada nombre. Esto es para evitar intentar redefinir alguna palabra clave de PostScript.}\\
graphic$_1$.labels $\leftarrow$  graphic$_2$.labels + $[$(definiendo, lower(LABEL))$]$}\footnote{Notar que la etiqueta nueva se define \textbf{luego} de las definidas y/o instanciadas en el gr\'afico que definen a dicha etiqueta. Esto es para evitar definiciones recursivas.}\\
\item graphic $\rightarrow$ LABEL\\
\texttt{
graphic.code $\leftarrow$ '\_' + lower(LABEL)\\
graphic.labels $\leftarrow$  $[$(instanciando, lower(LABEL))$]$}\\
\item graphic$_1$ $\rightarrow$ LPAREN graphic$_2$ RPAREN\\
\texttt{
graphic$_1$.code $\leftarrow$ graphic$_2$.code\\
graphic$_1$.labels $\leftarrow$  graphic$_2$.labels}\\
\item graphic$_1$ $\rightarrow$ graphic$_2$ graphic$_3$\\
\texttt{
graphic$_1$.code $\leftarrow$ 'gsave ' + graphic$_2$.code + ' grestore gsave ' + graphic$_3$.code + ' grestore'\\
graphic$_1$.labels $\leftarrow$  graphic$_2$.labels + graphic$_3$.labels}\\
\item num $\rightarrow$ NATURAL\\
\texttt{
num $\leftarrow$ NATURAL\\}
\item num $\rightarrow$ NOTNATURAL\\
\texttt{
num $\leftarrow$ NOTNATURAL\\}
\end{itemize}

\subsection{Resoluci\'on conflictos shift/reduce}

Para resolver los conflictos shift/reduce le indicamos a $yacc$ que priorice los reduce por sobre los shifts (cuando hay un gr\'afico listo, reducir a gr\'afico, para agrupar hacia izquierda), indicando que cada $token$ tiene precedencia a izquierda.

